import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import seaborn as sns
# Path ini tergantung pada drive mana yang digunakan
# Kasus kali ini menggunakan data yang berada di drive peneliti
data_path = '/content/drive/My Drive/Colab Notebooks/data/household_power_consumption/'
desc_path = '/content/drive/My Drive/Colab Notebooks/data/household_power_consumption/description.txt'
visdat_path = '/content/drive/My Drive/Colab Notebooks/visdat/household_power_consumption'
df = pd.read_csv(os.path.join(data_path,'household_power_consumption.txt'), sep = ';', dtype = 'object')
# Terdapat '?' pada nilai yang NA pada atribut (2,3,4,5,6,7), maka kita perlu ganti menjadi NA terlebih dahulu
for i in range(2,9):
df.iloc[:,i] = df.iloc[:,i].replace('?',np.nan).astype('float64')
# Mari kita pecah variabel Date menjadi Year, Month, dan Day
dt = pd.DatetimeIndex(df.Date)
df['Year'] = dt.year.astype('category')
df['Month'] = dt.month.astype('category')
df['Day'] = dt.day.astype('category')
# Kemudian, kita hapus kolom Date
df = df.drop('Date', axis = 1)
del dt
df
# Deskripsi Data
with open(desc_path, 'r') as file:
desc = file.read()
print(desc)
# Inisiasi variabel yang akan sering digunakan
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']
df.describe(include = 'all')
data = pd.crosstab(df.Year,df.Month)
data.columns = month
data
fig, ax = plt.subplots(3,1,figsize = (12,18), dpi = 300)
ax[0].scatter(df.Sub_metering_1, df.Sub_metering_2, c = df.Sub_metering_1.values, cmap = 'viridis')
ax[0].set_xlabel('Kitchen Appliances')
ax[0].set_ylabel('Laundry Room Appliances')
ax[1].scatter(df.Sub_metering_1, df.Sub_metering_3, c = df.Sub_metering_1.values, cmap = 'magma')
ax[1].set_xlabel('Kitchen Appliances')
ax[1].set_ylabel('Air Conditioner and Water Heater')
ax[2].scatter(df.Sub_metering_2, df.Sub_metering_3, c = df.Sub_metering_2.values, cmap = 'plasma')
ax[2].set_xlabel('Laundry Room Appliances')
ax[2].set_ylabel('Air Conditioner and Water Heater')
for i in range(3):
for spine in ['right', 'top']:
ax[i].spines[spine].set_visible(False)
fig.suptitle('Korelasi antara penggunaan daya listrik\nuntuk masing-masing alat listrik\n(Kitchen,Laundry,Air and Water Heater)')
fig.tight_layout(pad = 4)
fig.savefig(os.path.join(visdat_path, 'corelation submeter'))
Secara keseluruhan, kurang lebih daya yang digunakan oleh alat-alat rumah tangga selama 4 tahun (2006-2010) berkisar antara 0 hingga 2 kilowatt. Sedangkan daya reaktifnya berkisar kurang lebih 0 hingga 400 watt.
fig, ax = plt.subplots(2,2, figsize = (15,10),dpi = 300)
sns.boxplot(
x = df.Global_active_power[df.Global_active_power.notna()],
ax = ax[1][0], palette = 'magma'
)
sns.boxplot(
x = df.Global_reactive_power[df.Global_reactive_power.notna()],
ax = ax[1][1], palette = 'magma'
)
sns.histplot(
x = df.Global_active_power[df.Global_active_power.notna()], bins = 80,
element = 'bars', ax = ax[0][0]
)
sns.histplot(
x = df.Global_reactive_power[df.Global_reactive_power.notna()], bins = 80,
element = 'bars', ax = ax[0][1]
)
fig.suptitle('Distribusi Daya Aktif (Kiri) dan Daya Reaktif (Kanan)', fontsize = 30)
fig.savefig(os.path.join(visdat_path, 'power_active_reactive_distribution'))
fig, ax = plt.subplots(2,2, figsize = (15,10),dpi = 300)
sns.boxplot(
x = df.Global_intensity[df.Global_intensity.notna()],
ax = ax[1][0], palette = 'cividis'
)
sns.boxplot(
x = df.Voltage[df.Voltage.notna()],
ax = ax[1][1], palette = 'cividis'
)
sns.histplot(
x = df.Global_intensity[df.Global_intensity.notna()], bins = 80,
element = 'bars', ax = ax[0][0]
)
sns.histplot(
x = df.Voltage[df.Voltage.notna()], bins = 80,
element = 'bars', ax = ax[0][1]
)
fig.suptitle('Distribusi Intensitas Listrik (Kiri) dan Tegangan Listrik (Kanan)', fontsize = 30)
fig.savefig(os.path.join(visdat_path, 'voltage and intensity'))
fg = sns.FacetGrid(
df, row = 'Year', col = 'Month'
)
fg.map(
sns.scatterplot,'Global_active_power', 'Global_reactive_power',
)
plt.show()
Konsumsi rumah tangga terhadap daya listrik biasanya memuncak pada awal dan akhir tahun
Terlihat pola seasonal, dimana pada bulan awal dan akhir, rata-rata penggunaan daya listrik menjadi meningkat
data = df.groupby(['Year', 'Month'])[['Global_active_power', 'Global_reactive_power']].mean().reset_index()
data['Month'] = pd.Series(np.tile(month, 5)) + ' ' + data.Year.astype('string')
data = data.drop('Year', axis = 1)
fig, ax = plt.subplots(1,1,figsize = (18,10), dpi = 300)
sns.lineplot(
x = 'Month',
y = 'Global_active_power',
data = data,
ax = ax,
marker = 'o',
markersize = 8,
linewidth = 1
)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.set_xticklabels(data.Month.values, rotation = 90, fontsize = 15)
ax.set_ylabel('Global Active Power (KiloWatt)', fontsize = 18)
ax.grid(alpha = 0.4)
fig.suptitle('Rata-rata Penggunaan Daya Aktif, dan Daya Reaktif \nper bulan dari 2006 hingga 2010 ', fontsize = 30)
plt.savefig(os.path.join(visdat_path, 'Active and Reactive Power in time'))
Data yang terdapat pada tahun 2006 hanya bulan Desember
Daya aktif yang digunakan oleh rumah tangga cenderung beragam di awal tahun dan akhir tahun
Boxenplot memiliki lebar kotak yang cukup besar terutama di awal tahun (Januari) dan akhir tahun (Oktober, November, Desember), ini dapat memberi gambaran bahwa pola konsumtif energi listrik cenderung beragam dibandingkan dengan bulan-bulan lain
fig,ax = plt.subplots(4,1,figsize = (17,24), dpi = 300)
c = ['magma', 'viridis', 'cividis', 'inferno']
for i in range(4):
sns.boxenplot(
data = df[df.Year == 2007+i],
y = 'Global_active_power', x = df[df.Year == 2007+i].Month.astype('category'),
palette = c[i], ax = ax[i]
)
ax[i].set_xticklabels(month, fontsize = 14)
ax[i].set_title(str(2007+i), fontsize = 30)
ax[i].set_ylabel('Global Active Power', fontsize = 14)
ax[i].spines['top'].set_visible(False)
ax[i].spines['bottom'].set_visible(False)
ax[i].spines['right'].set_visible(False)
ax[i].spines['left'].set_visible(False)
fig.tight_layout(pad = 4)
fig.savefig(os.path.join(visdat_path, 'Global Active Power per month in all year (Boxenplot)'))
Rata-rata penggunaan daya listrik cenderung menaik di pertengahan tahun
Boxenplot melihat bagaimana persebaran penggunaan daya listrik, namun tidak memperlihatkan tendensi penggunaannya. Setelah diperlihatkan rata-rata penggunaan daya listrik per bulannya, terlihat rumah tangga cenderung sedikit mengonsumsi energi listrik pada pertengahan tahun, seperti pada bulan Juni, Juli, dan Agustus, dan mulai naik pada awal dan akhir tahun
Hal ini bisa jadi karena masyarakat cenderung menggunakan listrik pada musim-musim dingin
data = df.groupby(['Year', 'Month'])[['Global_active_power', 'Global_reactive_power']].mean().reset_index()
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']
fig, ax = plt.subplots(1,1,figsize = (15,10), dpi = 300)
data.Month = data.Month.astype('float64')
sns.lineplot(
y = 'Global_active_power', x = 'Month', data = data[data.Year != 2006], hue = 'Year',
ax = ax, palette = 'Set1', marker = 'o', markersize = 7
)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.set_xticks(np.arange(1,13))
ax.set_yticks(np.arange(0,1.6, 0.1))
ax.set_xticklabels(month, fontsize = 14)
ax.set_ylabel('Global Active Power', fontsize = 14)
ax.grid(alpha = 0.3)
ax.set_title('Rata-rata Penggunaan daya listrik aktif\nPer bulan tiap tahun', fontsize = 30, pad = 30)
ax.legend(loc = 'lower right', shadow = True, title = 'Year')
fig.savefig(os.path.join(visdat_path, 'Active Power (average)'))
Air Conditioner dan Water Heater menjadi alat yang paling tinggi menggunakan daya listrik¶
Dari rata-rata penggunaan daya listrik oleh beberapa alat rumah tangga, (Kitchen Appliances, Laundry Appliances, Air Conditioner/Water Heater), terlihat AC dan Pemanas Ruangan menjadi alat yang paling tinggi menggunakan daya listrik.
Terlihat rata-rata sebesar kurang lebih 6wattHours yang digunakan untuk AC dan pemanas ruangan, dibandingkan dengan Alat dapur dan Alat Mencuci.
Bisa jadi karena penggunaan AC dan pemanas ruangan lebih sering dibandingkan dengan alat lainnya
Persebaran penggunaan daya listrik oleh Air Conditioner dan Water Heater cukup beragam dibandingkan alat rumah tangga lain¶
Selain menjadi alat yang menggunakan daya yang tinggi, Persebaran daya listrik untuk Air Conditioner dan Water Heater yang digunakan untuk tiap waktunya cukup beragam.
data = df.describe()[['Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']].drop('count')
data.columns = ['Kitchen', 'LaundryRoom', 'AirConditioner']
data
from sklearn.preprocessing import StandardScaler
data = df[['Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']]
# StandardScaler digunakan untuk melakukan scaling terhadap variabel
ss = StandardScaler()
result = ss.fit_transform(data)
fig,ax = plt.subplots(1,1,figsize = (15,8), dpi = 300)
sns.boxplot(
data = pd.DataFrame(
data = result.ravel(),
index = np.repeat(['Kitchen', 'LaundryRoom', 'AirConditioner'], len(result)),
columns = ['Watt']
).reset_index(),
x = 'Watt',
y = 'index',
ax = ax,
width = 0.6,
linewidth = 0.2,
palette = 'viridis'
)
fig.suptitle('Persebaran Daya yang dipakai menurut appliances\nSetelah dilakukan scaling', fontsize = 30)
ax.set_ylabel('Appliance', fontsize = 16)
ax.set_xlabel(None)
ax.tick_params(
left = False,
bottom = False,
labelbottom = False
)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.savefig(os.path.join(visdat_path, 'Appliances distribution (boxplot)'))
Air Conditioner dan Water Heater¶
fig, ax = plt.subplots(2,1,figsize = (14,18), dpi = 300)
# Boxplot
sns.boxplot(
data = df,
y = 'Sub_metering_3',
x = 'Month',
ax = ax[0],
palette = 'plasma'
)
ax[0].set_xticklabels(month)
ax[0].set_ylabel('WattHours')
ax[0].set_title('Persebaran Penggunaan\nAir Conditioner dan Water Heater\nTiap Bulannya', fontsize = (30), pad = 30)
for spine in ['top', 'left','bottom','right']:
ax[0].spines[spine].set_visible(False)
# Line Plot
data = df.groupby('Month').Sub_metering_3.mean().reset_index().astype('float64')
ax[1].plot(
data.Month, data.Sub_metering_3, color = plt.get_cmap('inferno')(60),
marker = 'o'
)
ax[1].set_title(
'Rata-Rata Penggunaan daya listrik\npada Penghangat dan Pendingin Ruangan\nTiap Bulan',
fontsize = 30, pad = 30
)
ax[1].set_ylim(0,8)
ax[1].set_ylabel('WattHours')
ax[1].set_xticks(np.arange(1,13))
ax[1].set_xticklabels(month)
ax[1].grid(zorder = 0)
for spine in ['top', 'left','bottom','right']:
ax[1].spines[spine].set_visible(False)
fig.tight_layout(pad = 3)
fig.savefig(os.path.join(visdat_path, 'AC and WH per month'))